﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using System.Web.Mvc.Html;
using ControleRepresentante.Logic.Models;
using WebSite.ViewModels.DetailsViewModels.DetailsGridViewModels;
using WebSite.ViewModels.Fields;

namespace WebSite.ViewModels.DetailsViewModels
{
    public class PedidoDetailsViewModel : AttributeHolderDetailsViewModel
    {
        private readonly bool m_CanViewCliente;
        private readonly bool m_CanViewVendedor;
        private readonly bool m_CanViewFabrica;
        private readonly bool m_CanViewTransportadora;
        private readonly bool m_CanCreate;
        private readonly bool m_CanPrint;

        public PedidoDetailsViewModel(bool canViewCliente, bool canViewVendedor, bool canViewFabrica, bool canViewTransportadora, bool canCreate, bool canPrint)
            : base("Pedido")
        {
            m_CanViewCliente = canViewCliente;
            m_CanPrint = canPrint;
            m_CanCreate = canCreate;
            m_CanViewTransportadora = canViewTransportadora;
            m_CanViewFabrica = canViewFabrica;
            m_CanViewVendedor = canViewVendedor;
        }

        protected override IEnumerable<IField> GetGeralFields()
        {
            Pedido pedido = (Pedido)Model;

            yield return new LabelField("Número", "numero", pedido.Numero);
            yield return CreateField(m_CanViewCliente, "Cliente", "cliente", "Cliente", x => x.Cliente.Id, x => x.ClienteNome);
            if (m_CanViewVendedor)
            {
                yield return CreateField(true, "Vendedor", "vendedor", "Vendedor", x => x.Vendedor.Id, x => x.VendedorNome);
            }
            yield return CreateField(m_CanViewFabrica, "Fábrica", "fabrica", "Fabrica", x => x.Fabrica.Id, x => x.FabricaNome);
            yield return CreateField(m_CanViewTransportadora, "Transportadora", "transportadora", "Transportadora", x => x.Transportadora.Id, x => x.TransportadoraNome);
            yield return new LabelField("Data", "data", pedido.Data);
            yield return new LabelField("Criado", "criado", String.Format("{0} {1}", pedido.Created.ToShortDateString(), pedido.Created.ToShortTimeString()));
            yield return new LabelField("Modificado", "modificado", String.Format("{0} {1}", pedido.Modified.ToShortDateString(), pedido.Modified.ToShortTimeString()));
            yield return new LabelField("Condição de Pagamento", "condicaoPagamento", pedido.CondicaoPagamento);
            yield return new LabelField("Prazo de Entrega", "prazoEntrega", pedido.PrazoEntrega);
            yield return new LabelField("Total de Peças", "totalPecas", pedido.TotalPecas);
            yield return new LabelField("Total da Mercadoria", "totalMercadoria", String.Format("{0:C}", pedido.TotalMercadoria));
            yield return new LabelField("Desconto", "desconto", String.Format("{0:0.0}%", pedido.Desconto));
            yield return new LabelField("Valor do Desconto", "valorDesconto", String.Format("{0:C}", pedido.ValorDesconto));
            yield return new LabelField("Valor do Imposto", "valorImposto", String.Format("{0:C}", pedido.ValorImposto));
            yield return new LabelField("Total Líquido", "totalLiquido", String.Format("{0:C}", pedido.TotalLiquido));
            yield return new LabelField("Faturado", "faturado", pedido.Faturado);
            yield return new LabelField("Cancelado", "cancelado", pedido.Cancelado);
            yield return new LabelField("Observação", "observacao", pedido.Observacao, true);

            foreach (IField field in base.GetGeralFields())
            {
                yield return field;
            }
        }

        private IField CreateField(bool canView, string caption, string name, string controllerName, Func<Pedido, Guid> getModelId, Func<Pedido, string> getText)
        {
            Pedido pedido = (Pedido)Model;
            return canView
                       ? (IField) new LinkField(caption, name, getText(pedido), "Details", controllerName, new {id = getModelId(pedido)})
                       : new LabelField(caption, name, getText(pedido));
        }

        protected override IEnumerable<TabItem> GetTabs(HtmlHelper htmlHelper)
        {
            List<TabItem> result = base.GetTabs(htmlHelper).ToList();

            Pedido pedido = (Pedido)Model;

            result.Add(new TabItem("Produtos",
                "~/Content/produto.png",
                new ProdutoDetailsGridViewModel(htmlHelper, pedido)));

            result.Add(new TabItem("Posts",
                "~/Content/post.png",
                htmlHelper.Partial("Posts", pedido).ToHtmlString()));

            return result;
        }

        public override IEnumerable<ButtonType> AdditionalButtons
        {
            get
            {
                List<ButtonType> result = new List<ButtonType>(base.AdditionalButtons);
                if (m_CanCreate)
                {
                    result.Add(ButtonType.Duplicate);
                }
                if (m_CanPrint)
                {
                    result.Add(ButtonType.Print);
                }
                return result;
            }
        }
    }
}